#ifndef CYBER_COMMON_LOG_H_
#define CYBER_COMMON_LOG_H_

#include <iostream>
#include <sstream>
#include <mutex>

namespace cyber {
namespace common {

/*日志枚举*/
enum LogLevel {
  DEBUG = 0,
  INFO = 1,
  WARN = 2,
  ERROR = 3,
  FATAL = 4
};
class Logger {   
public:
    static Logger& Instance();  // 单例模式，保证只有一个实例

    template<typename... Args>
    void Log(LogLevel level,Args... args) {//Args... args 可变参数，表示可以传入任意个参数

        if(level >= current_level_) {
          std::lock_guard<std::mutex> lock(log_mutex_);
          std::stringstream ss;
          (ss << ... << args);
          WriteLog(level, ss.str());
        }
    }
    void SetLevel(LogLevel level) {
        current_level_ = level;
    }
    

private:
    Logger() {}                 //构造函数，私有化，防止外部创建实例  
    ~Logger()=default;          //析构函数
    
    Logger(const Logger&)=delete;//删除拷贝构造函数，防止拷贝
    Logger& operator=(const Logger&)=delete;//删除赋值运算符，防止赋值


    void Init();//初始化
    void WriteLog(LogLevel level, const std::string& message);//写日志

    LogLevel current_level_ = INFO;//当前日志级别
    
    std::mutex log_mutex_;//日志互斥锁

};

}  // namespace common
}  // namespace cyber

#endif  // CYBER_COMMON_LOG_H_